package com.bp.hearthealth.pulse.lnapps.bp_utils

import android.os.SystemClock
import android.view.View

private const val DEFAULT_INTERVAL = 1000L
class ClickHandler(private val interval: Long) {
    private var lastClickTime = 0L

    fun onClick(view: View, action: () -> Unit) {
        val currentTime = SystemClock.elapsedRealtime()
        if (currentTime - lastClickTime >= interval) {
            action.invoke()
            lastClickTime = currentTime
        }
    }
}

/**
 * 在用户停止点击一段时间后才执行点击事件处理逻辑
 * 如果在用户点击之后的一定时间内再次发生点击，那么之前的点击事件将被取消，不会触发处理逻辑。
 * 这种方式适用于需要在用户停止操作一段时间后才执行相应的操作，例如搜索框中输入关键字后，等待用户停止输入一段时间后再进行搜索操作。
 */
fun View.debounceClick(interval: Long = DEFAULT_INTERVAL, onClick: () -> Unit) {
    val onClickListener = object : View.OnClickListener {
        private val clickHandler = ClickHandler(interval)

        override fun onClick(view: View) {
            clickHandler.onClick(this@debounceClick, onClick)
        }
    }
    setOnClickListener(onClickListener)

    addOnAttachStateChangeListener(object : View.OnAttachStateChangeListener {
        override fun onViewAttachedToWindow(v: View) {

        }

        override fun onViewDetachedFromWindow(v: View) {
            setOnClickListener(null)
            removeOnAttachStateChangeListener(this)
        }
    })
}


/**
 * 在指定的时间间隔内只处理一次点击事件
 * 如果在两次点击事件之间的时间间隔小于指定的时间间隔，那么后续的点击事件将被忽略。
 * 这种方式适用于需要限制用户在一定时间内重复点击的场景，例如避免用户在短时间内多次点击提交按钮。
 */
fun View.throttleClick(interval: Long = DEFAULT_INTERVAL, onClick: () -> Unit) {
    val onClickListener = View.OnClickListener {
        if (isEnabled) {
            isEnabled = false
            postDelayed({
                isEnabled = true
            }, interval)
            onClick()
        }
    }
    setOnClickListener(onClickListener)

    addOnAttachStateChangeListener(object : View.OnAttachStateChangeListener {
        override fun onViewAttachedToWindow(v: View) {

        }

        override fun onViewDetachedFromWindow(v: View) {
            setOnClickListener(null)
            removeOnAttachStateChangeListener(this)
        }
    })
}